2022-12-24 Stolperfalle bei NPTv6

LANconfig NPTv6

NPTv6 / IPv6-Forwarding / Ports / Checksum-Neutral Mapping

NPTv6/IPv6-to-IPv6 Network Prefix Translation wird häufig nur als Stateless[1] Eins-zu-eins-Umschreibung von IPv6-Präfixen beschrieben. Also z.B. eine private Adresse mit dem Präfix fd00:abc::/64 wird auf eine öffentliche Adresse mit dem Präfix 2001:db8:abc::/64 geändert:
fd00:abc::1:2:3:4 würde zu 2001:db8:321::1:2:3:4
Aber das stimmt nicht ganz und das Beispiel ist fehlerhaft.

Die Adressänderung wird einfach am IP-Header vorgenommen. Doch so leicht ist es nicht. Sowohl bei TCP, UDP als auch IMCP wird zur Berechnung der Paketprüfsumme unter anderem die Quell-IP einbezogen. Ein schlichtes Eins-zu-eins-Umschreiben würde also zu ungültigen Paketen auf einer höheren Schicht führen. Der Workaround, der bei NPTv6 gewählt wurde, ist nun die Umgesetzte IPv6-Adresse so zu konstruieren, das bei der Prüfsummenberechnung weiterhin dasselbe Ergebnis rauskommt.[2] :-)
Die Prüfsummenfelder sind nur 16bit lang. Entsprechend genügt es (bei diesem Algorithmus) 16bit in der IPv6-Adresse zu manipulieren, um alle möglichen Ergebnisse erhalten zu können. NPTv6 versucht 16bit im Präfix zu nehmen. Ein Segen wer von seinem ISP /48 erhält. Ist das nicht möglich, hat die Umsetzung Auswirkung auf den Host-/Interface-Identifier. Wie dieses Beispiel zeigt:
Vergleich vor und noch Umsetzung
Mein ISP delegiert mir nur ein /64-Präfix. Weswegen, wie bei 2 zu sehen, die ersten 16bit des Host-Identifiers leiden.

Mögliche Stolperfallen lauern nun bei Firewallregeln und DynDNS. Denn man kann eben nicht einfach nur den öffentlichen Präfix und Identifier zusammen kopieren!

Eine Möglichkeit Scriptgesteuert an die IP-Adresse zukommen, ist mit Hilfe der Webseite⎇ifconfig.co. Erkennt sie den curl-Header liefert, sie nur die IP zurück:
curl
(Curl ist mittlerweile Bestandteil von Windows.)
Es muss per --interface die gewünschte Adresse angeben werden, da sonst ja nur eine Temporäre verwendet wird.

Damit unter OpenBSD curl nicht extra installieren werden muss, genügt es das ftp den curl Header vorgibt: OpenBSDs ftp
(Ohne den curl-Header wir das HTML der ganzen Webseite zurück geliefert.)

Bei einigen dynDNS-Anbietern, wie z.B. ⎇deSEC, ist das Übergeben einer Adresse als Parameter optional. So genügt es
https://update.dedyn.io/update?username=beispiel.dedyn.io
vom gewünschten Host aus aufzurufen. Es wird dann schlicht die eingehende Adresse gesetzt. Damit erspart man sich, Clientseitig erst die externe Adresse ermitteln zu müssen.

[1] Es muss nicht über laufende Verbindungen buchgeführt werden.
[2] ⎇RFC 6296 - 2.6. Checksum-Neutral Mapping

⍈Homepage

#